package com.msh.frame.common.util;

import java.nio.charset.StandardCharsets;
import java.security.MessageDigest;


/**
 * @author shihu
 */
public class Sha256Util {

  public static void main(String[] args) {
    System.out.println(Sha256Util.strToHex("testtest"));
  }

  /**
   * 把字节数组转成16进位制数
   */
  public static String bytesToHex(byte[] bytes) {
    StringBuffer sha256str = new StringBuffer();
    //把数组每一字节换成16进制连成sha256字符串
    int digital;
    for (int i = 0; i < bytes.length; i++) {
      digital = bytes[i];
      if (digital < 0) {
        digital += 256;
      }
      if (digital < 16) {
        sha256str.append("0");
      }
      sha256str.append(Integer.toHexString(digital));
    }
    return sha256str.toString().toLowerCase();
  }

  /**
   * 把字节数组转换成sha256
   */
  public static String bytesToSha256(byte[] input, int time) {
    String sha256str = null;
    try {
      //创建一个提供信息摘要算法的对象，初始化为sha256算法对象
      MessageDigest md = MessageDigest.getInstance("SHA-256");
      while (time > 0) {
        //计算后获得字节数组
        input = md.digest(input);
        time--;
      }
      //把数组每一字节换成16进制连成sha256字符串
      sha256str = bytesToHex(input);
    } catch (Exception e) {
      e.printStackTrace();
    }
    return sha256str;
  }

  /**
   * 把字符串转换成sha256
   *
   * @param str 加密字符串ss
   * @param time 次数
   */
  public static String strToSha256(String str, int time) {
    return bytesToSha256(str.getBytes(StandardCharsets.UTF_8), time);
  }

  /**
   * 把字符串转成16进位制数 循环此方法和strToMD5(str, n)加密多次返回结果不同
   *
   * @param str 加密字符串
   */
  public static String strToHex(String str) {
    return strToSha256(str, 1);
  }
}
